/*
 * Copyright (c) 2013 UCE (Universidad Central del Ecuador), todos los derechos
 * reservados. Este software es confidencial y su informacion es propiedad de
 * UCE (Universidad Central del Ecuador). No debe revelar tal informacion y debe usarla
 * unicamente de acorde con los terminos de uso.
 */

package ec.linde.modulos.proyectos;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import ec.linde.modulos.proyectos.servicio.ServicioContratista;
import ec.linde.persistencia.entidades.proyectos.ContactoContratista;
import ec.linde.persistencia.entidades.proyectos.Contratista;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/03/2013
 * @author: Alex Carrillo
 * @FechaModificacion: 29/03/2013
 * @author: Alex Carrillo
 * @version: 1.0
 */
@ManagedBean
@ViewScoped
public class ContratistaBean extends PageController {

	private static final long serialVersionUID = 1L;

	/**
	 * Servicios
	 */
	@EJB
	private ServicioContratista servicioContratista;

	/**
	 * Atributos Forma
	 */
	private Contratista contratista;

	/**
	 * Listados 1. Lista Lazy DataModel 2. Lista Detalles 3. Listas Combo
	 */
	private LazyDataModel<Contratista> listaContratista;

	/**
	 * UI
	 */
	private DataTable dtContratista;

	/**
	 * PostContrutor
	 */
	@PostConstruct
	public void init() {

		listaContratista = new LazyDataModel<Contratista>() {

			private static final long serialVersionUID = 1L;

			@Override
			public List<Contratista> load(int startIndex, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				List<Contratista> lista = new ArrayList<Contratista>();

				boolean ordenar = sortOrder == SortOrder.ASCENDING ? true : false;
				lista = servicioContratista.obtenerListaPorPagina(startIndex, pageSize, sortField, ordenar, filters);

				listaContratista.setRowCount(servicioContratista.contarPorCriterio(filters));

				return lista;
			}
		};

	}

	/**
	 * Metodos
	 */

	/**
	 * Crea Contratista
	 */
	private void crearContratista() {
		contratista = new Contratista();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#editar()
	 */
	public String editar() {
		if (getContratista().getId() > 0) {
			contratista = servicioContratista.cargarDetalle(getContratista().getId());
			setEditado(true);
		} else {
			addInfoMessage("Seleccione un Registro");
		}
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#guardar()
	 */
	public String guardar() {
		try {
			servicioContratista.guardar(contratista);
			addInfoMessage("Registro Guardado Correctamente");
			setEditado(false);
			limpiar();
		} catch (Exception e) {
			addErrorMessage("Error al Guardar el registro");
		}
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#eliminar()
	 */
	public String eliminar() {
		try {
			servicioContratista.eliminar(contratista);
			limpiar();
			addInfoMessage("Registro Eliminado con Correctamente");
		} catch (Exception e) {
			addErrorMessage("Error al Eliminar el registro");
		}
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#limpiar()
	 */
	public String limpiar() {
		crearContratista();
		return "";
	}

	/**
	 * Metodos Eventos
	 */
	public List<ContactoContratista> getListaContactos() {
		List<ContactoContratista> lista = new ArrayList<ContactoContratista>();
		for (ContactoContratista contacto : contratista.getListaContactoContratista()) {
			if (!contacto.isEliminado()) {
				lista.add(contacto);
			}
		}
		return lista;
	}

	/**
	 * Elimina el detalle del contacto TODO: Agregar descripcion del metodo
	 * 
	 * @param contacto
	 */
	public void eliminarContacto(ContactoContratista contacto) {
		contacto.setEliminado(true);
	}

	public void agregarContacto() {
		ContactoContratista contacto = new ContactoContratista();
		contacto.setContratista(contratista);
		contratista.getListaContactoContratista().add(contacto);
	}

	/**
	 * Metodos GET Y SET
	 */

	/**
	 * Get del atributo contratista
	 * 
	 * @return el valor del atributo contratista
	 */
	public Contratista getContratista() {
		if (contratista == null) {
			contratista = new Contratista();
		}
		return contratista;
	}

	/**
	 * Set del atributo contratista
	 * 
	 * @param contratista
	 *            valor para asignar al atributo contratista
	 */
	public void setContratista(Contratista contratista) {
		this.contratista = contratista;
	}

	/**
	 * Get del atributo listaContratista
	 * 
	 * @return el valor del atributo listaContratista
	 */
	public LazyDataModel<Contratista> getlistaContratista() {
		return listaContratista;
	}

	/**
	 * Set del atributo listaContratista
	 * 
	 * @param listaContratista
	 *            valor para asignar al atributo listaContratista
	 */
	public void setlistaContratista(LazyDataModel<Contratista> listaContratista) {
		this.listaContratista = listaContratista;
	}

	/**
	 * Get del atributo dtContratista
	 * 
	 * @return el valor del atributo dtContratista
	 */
	public DataTable getDtContratista() {
		return dtContratista;
	}

	/**
	 * Set del atributo dtContratista
	 * 
	 * @param dtContratista
	 *            valor para asignar al atributo dtContratista
	 */
	public void setDtContratista(DataTable dtContratista) {
		this.dtContratista = dtContratista;
	}

}
